package com.atguigu.user.service.impl;

        import com.atguigu.constants.UserConstants;
        import com.atguigu.param.UserCheckParam;
        import com.atguigu.param.UserLoginParam;
        import com.atguigu.pojo.User;
        import com.atguigu.user.mapper.UserMapper;
        import com.atguigu.user.service.UserService;
        import com.atguigu.utils.MD5Util;
        import com.atguigu.utils.R;
        import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;

/**
 * @author 张三禾
 * @create 2023-03-02 19:29
 * @Description 用户业务实现类
 */

@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 1. 检查账号是否可用业务
     *
     * @param userCheckParam 账号参数 已经校验完毕
     * @return 检查结果 001  004
     */
    //其实这里用的是Mybatis-Plus
    @Override
    public R check(UserCheckParam userCheckParam) {

        //参数封装
        /*
        * eq: 等于 ne: 不等于 gt: 大于 lt: 小于 ge: 大于等于 le: 小于等于  like: 模糊查询
        * in: 包含于，例如：in("id", Arrays.asList(1, 2, 3)) 表示查询 id 在 1、2、3 中的数据。
        * */
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //eq方法：匹配user_name为后面那个参数的查询条件
        queryWrapper.eq("user_name",userCheckParam.getUserName());
        //数据库查询
        Long total = userMapper.selectCount(queryWrapper);
        //查询结果处理
        if (total == 0){
            //数据库中不存在,可用
            log.info("UserServiceImpl.check业务结束，结果:{}","账号可以使用!");
            return R.ok("账号不存在,可以使用!");
        }

        log.info("UserServiceImpl.check业务结束，结果:{}","账号不可使用!");

        return R.fail("账号已经存在,不可注册!");
    }

    @Override
    public R register(User user) {
//        1. 检查账号是否存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //eq方法：匹配user_name为后面那个参数的查询条件
        queryWrapper.eq("user_name",user.getUserName());
        //数据库查询
        Long total = userMapper.selectCount(queryWrapper);

        if(total > 0){
            log.info("UserServiceImpl.register业务结束，结果：{}","账号存在，注册失败");
            return R.fail("账号已经存在，不可注册");
        }
        //2. 密码加盐处理，MD5，一种不可逆转加密方式，不可解密。固定明文加密之后是固定的。
        /**
         *MD5可以暴力破解，穷举。
         * 解决暴力办法：1. 加盐 用户密码+字符串 ，这个字符串就是盐
         */
        String newPwd = MD5Util.encode(user.getPassword()+ UserConstants.USER_SLAT);
        user.setPassword(newPwd);
        
        //3. 数据库插入
        int rows = userMapper.insert(user);
        /**
         * 4. 返回封装结果
         *  rows == 0 ：注册失败
         */
        if(rows==0){
            log.info("UserServiceImpl.register业务结束，结果：{}", "数据插入失败，注册失败");
            return R.fail("注册失败！请稍后尝试！");
        }

        log.info("UserServiceImpl.register业务结束，结果：{}", "注册成功！");
        return R.ok("注册成功！");
    }

    /**
     * 登录业务
     *1. 密码的加密和加盐处理
     *2. 账号密码查询，返回一个完整的数据库user对象
     *3. 判断返回结果
     * @param userLoginParam 已经校验，但是密码是明文
     * @return 结果 001 004
     */
    @Override
    public R login(UserLoginParam userLoginParam) {
        //1. 密码处理
        String newPwd = MD5Util.encode(userLoginParam.getPassword() +UserConstants.USER_SLAT);

        //2. 数据库查询
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name",userLoginParam.getUserName());
        queryWrapper.eq("password",newPwd);

        User user = userMapper.selectOne(queryWrapper);

        //3. 结果处理
        if(user == null){
            log.info("UserServiceImpl.login业务结束，结果：{}", "账号或密码错误");
            return R.fail("账号或密码错误！");
        }

        log.info("UserServiceImpl.login业务结束，结果：{}", "登录成功");
        //配合@JsonInclude(JsonInclude.Include.NON_NULL)，不返回password属性
        user.setPassword(null);
        return R.ok("登录成功",user);
    }


}
